package akbderby.page;

import java.util.Date;

import org.slim3.controller.Navigation;
import org.slim3.datastore.Datastore;

import scenic3.annotation.ActionPath;
import scenic3.annotation.Default;
import scenic3.annotation.Page;
import scenic3.annotation.Var;
import akbderby.model.Answer;
import akbderby.model.Question;
import akbderby.model.Quiz;
import akbderby.model.UserAnswer;

@Page("/quizdo")
public class QuizDoPage extends QuizBasePage {

    @ActionPath("select/{id}")
    public Navigation select(@Var("id") String id) {
        Quiz quiz = getQuiz(id);
        if (isNull(quiz)) {
            // クイズがありません。
            return forward("error.jsp");
        }
        setQuizKeyWithSession(quiz.getKey());
        return redirect("/quizdo/index");
    }

    @ActionPath("start")
    public Navigation start() {
        Quiz quiz = getQuiz();
        if (isNull(quiz)) {
            // クイズがありません。
            return forward("error.jsp");
        }
        if (!quiz.getPasscd().equals(requestScope("passcd"))) {
            // パスコードが一致しません。
            return forward("error.jsp");
        }
        String userNm = requestScope("userNm");
        if (isNull(userNm)) {
            // 名前が入力されていません。
            return forward("error.jsp");
        }
        UserAnswer ua = new UserAnswer();
        ua.getQuizRef().setModel(quiz);
        ua.setUserNm(userNm);
        ua.setStartTime(new Date());
        Datastore.put(ua);
        setUserAnswer(ua);
        return redirect("/quizdo/show/1");
    }

    @ActionPath("show/{questionNo}")
    public Navigation show(@Var("questionNo") int questionNo) {
        if (isNull(getUserAnswer())) {
            // ユーザーが設定されていません。
            return forward("error.jsp");
        }
        Question question = getQuestion(questionNo);
        if (isNull(question)) {
            // クイズがありません。
            return forward("error.jsp");
        }
        setQuestion(question);
        return forward("/quizdo/show.jsp");
    }

    @ActionPath("answer/{questionNo}")
    public Navigation answer(@Var("questionNo") int questionNo) {
        UserAnswer ua = getUserAnswer();
        if (isNull(ua)) {
            // ユーザーが設定されていません。
            return forward("error.jsp");
        }
        Question question = getQuestion(questionNo);
        if (isNull(question)) {
            // クイズがありません。
            return forward("error.jsp");
        }
        Answer answer = new Answer();
        answer.getUserAnswerRef().setModel(ua);
        answer.setAnswer((String) requestScope("answer"));
        answer.setRightAnswer(question.getAnswer());
        answer.setJudgment(answer.getAnswer().equals(answer.getRightAnswer()));

        if (answer.isJudgment()) {
            ua.setScore(ua.getScore() + 1);
        }
        Datastore.put(ua, answer);

        questionNo++;

        question = getQuestion(questionNo);
        if (isNull(question)) {
            return redirect("/quizdo/end");
        }
        return redirect("/quizdo/show/" + questionNo);
    }

    @ActionPath("end")
    public Navigation end() {
        UserAnswer ua = getUserAnswer();
        if (isNull(ua)) {
            // ユーザーが設定されていません。
            return forward("error.jsp");
        }
        ua.setEndTime(new Date());
        Datastore.put(ua);
        return forward("/quizdo/end.jsp");
    }

    @Default
    public Navigation index() {
        Quiz quiz = getQuiz();
        sessionScope("quiz", quiz);
        sessionScope("questions", quiz.getQuesionListRef().getModelList());
        return forward("index.jsp");
    }

    private UserAnswer getUserAnswer() {
        return sessionScope("userAnswer");
    }

    private void setUserAnswer(UserAnswer ua) {
        sessionScope("userAnswer", ua);
    }

    private Question getQuestion() {
        return sessionScope("question");
    }

    private void setQuestion(Question question) {
        sessionScope("question", question);
    }

}
